//
//  iterator.c
//  pr_fun1
//
//  Created by chenyh on 2021/1/25.
//

#include "iterator.h"

void iterator_if_init(iterator_if_t *p_if,iterator_prev_t pfn_next,iterator_prev_t pfn_prev) {
    p_if->pfn_prev = pfn_prev;
    p_if->pfn_next = pfn_next;
}
void iterator_next(iterator_if_t *p_if,iterator_t *p_iter) {
    p_if->pfn_next(p_iter);
} //让迭代器指向容器的下一个数据
void iterator_prev(iterator_if_t *p_if,iterator_t *p_iter) {
    p_if->pfn_prev(p_iter);
}

void iter_sort(iterator_if_t *p_if,iterator_t begin,iterator_t end,compare_t compare,swap_t swap) {
    int flag = 1;
    iterator_t it1 = begin; //p1指向数组的首元素
    iterator_t it2 = end;   //p2指向数组的尾元素
    iterator_t pNext;      //pNext指向p1所指向的元素的下一个元素
    if (begin == end) {
        return; //没有需要算法处理的迭代器
    }
    iterator_prev(p_if, &it2); //it2指向需要排序的最后一个元素
    
    while (it2 != begin) {
        it1 = begin;
        flag = 1;
        while (it1 != it2) {
            pNext = it1; //暂存
            iterator_next(p_if, &pNext); //it_next为ite1的下一个元素
            if (compare(it1,pNext)>0) {     //比较指针所指向的值的大小
                swap(it1,pNext);     //交换两个指针的内容
                flag = 0;           //flag=0，表示2个指针的内容交换
            }
            it1=pNext;                //p1指针后移
        }
        if (flag) return;         //没有交换,表示已经有序，则直接返回
        iterator_prev(p_if, &it2);                    //it2指针前移
        
    }
}

void iter_foreach(iterator_if_t *p_if,iterator_t begin,iterator_t end,visit_t visit,void *p_arg) {
    iterator_t it = begin;
    
    while (it != end) {
        printf("%d ",*(int *)it);
        if (visit(p_arg,it) < 0) { //若返回值为负值，标明用户终止了遍历
            return;
        }
        iterator_next(p_if, &it);  //让迭代器向后移动
        printf("%d ",*(int *)it);
    }
    
}

static void __array_iterator_next(iterator_t *p_iter)
{
    (* (element_type_t **)(p_iter))++;
    
}
static void __array_iterator_prev(iterator_t *p_iter)
{
    (* (element_type_t **)(p_iter))++;
    
}
void array_iterator_if_get(iterator_if_t *p_if)
{
    iterator_if_init(p_if, __array_iterator_next, __array_iterator_prev);
}
